import router from './router'

import NProgress from 'nprogress' // progress 进度条
import 'nprogress/nprogress.css'// progress bar style

import { getToken } from './utils/auth'
import store from './store/index'

// 判断当前路由是否可访问，如果不能统一跳转到 401
function hasPermission (roles, permissionRoles) {
  if (!permissionRoles) return true
  return roles.some(role => permissionRoles.indexOf(role) >= 0)
}

const whiteList = ['/login']

router.beforeEach((to, from, next) => {
  NProgress.start()
  /**
   * 判断是否已登录/是否存在 token
   * 1. 如果存在 token，在登陆页就自动跳转到首页；
   * 2. 否则会判断状态管理中是否存在权限数据
   *  2.1 如果存在直接下一步
   *  2.1 如果不存在就需要调用用户接口，获取到权限数据
   */
  if (getToken()) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      if (store.getters.roles.length < 1) {
        // 请求接口获取用户权限信息
        store.dispatch('getUserInfo').then(res => {
          const roles = res

          // 根据用户权限信息添加路由表
          store.dispatch('GenerateRoutes', { roles }).then(() => {
            store.getters.addRouters.forEach(val => {
              router.addRoute(val)
            })

            next({ ...to, replace: true })
          })
        }).catch(() => {
          store.dispatch('signOut').then(() => {
            next({ path: '/' })
          })
        })
      } else {
        if (hasPermission(store.getters.roles, to.meta.roles)) {
          next()
        } else {
          next({ path: '/401', replace: true, query: { noGoBack: true } })
        }
      }
    }
  } else {
    /**
     * token 不存在
     * 判断是否是免登录，如果是不做处理
     * 如果不是，跳转到登陆页
     */
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next({ path: '/login' })
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})
